

public class PageNavigationUtils {
	
    // 导航条上的导航数量。例如：显示 [5 6 7 8 9]，就是 5 个。
    private final int pageNavSize;
    
    // 页码，从 1 开始
    private final int pageNum;
    
    private final int totalPages;

    public PageNavigationUtils(int pageNavSize, int pageNum, int totalPages) {
		super();
    	if (pageNum > totalPages)
    		throw new IllegalArgumentException();
		this.pageNavSize = Math.min(pageNavSize, totalPages);
		this.pageNum = pageNum;
		this.totalPages = totalPages;
	}

	/**
     * 返回快速导航页码 << < 1 2 3 4 5 > >>
     * 难点在中间的五个数字，通常情况下 PageNum（当前你浏览的页数）在中间，每当翻页时五个数字都会发生变化，
     * 但如果总页数较小或者 PageNum 较小时则不一定发生变动，同时还需要注意总页数小于 5 的问题。
     *
     * << 为到第一页
     * < 为上一页
     *  firstNum 通常为 PageNum - 2
     * secondNum 通常为 PageNum - 1
     *  thirdNum 通常为 PageNum
     * fourthNum 通常为 PageNum + 1
     *  fifthNum 通常为 PageNum + 2
     * > 为下一页
     * >>为最后一页
     */
    public int[] getPageNavs() {
        // 先运算出原始的左，右边界，例如，可能会算出：-1 0 1 2 3
        int start = 0, end = 0;
        int half = pageNavSize / 2;
        start = pageNum - half;
        if (pageNavSize % 2 == 0) {
            end = pageNum + half - 1;
        } else {
            end = pageNum + half;
        }

        /* 对原始的左右边界进行修正，分三种情况处理 */
        int[] arr = new int[pageNavSize];
        
        System.out.println("debug: " + pageNavSize);

        /* 情况一：修正左边界，显示前 N 个*/
        if (start < 1) { 
            for (int i = 0, step = 1; i < pageNavSize; i++, step++) {
            	if (step > totalPages)
            		break;
            	arr[i] = step;
            }
            return arr;
        } 

        /* 情况二：修正右边界，显示后 N 个*/
        if (end > totalPages) { // 修正右边界，显示后 N 个
            for (int i = pageNavSize - 1, step = totalPages; i >= 0; i--, step--) {
            	if (step <= 0)
            		break;
            	arr[i] = step;
            }
            return arr;
        }

        /* 情况三：正好在中间 */
        for (int i = 0; i < pageNavSize; i++) {
        	arr[i] = start++;
        }

        return arr;
    }

}
